﻿#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenu>
#include <QAction>
#include <QIcon>
#include <QActionGroup>
#include <QToolBar>
#include <QSpinBox>
#include <QToolButton>
#include <QDebug>
#include <QTextCodec>
#include <QMessageBox>
#include <iostream>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /*
     *  QMenuBar 菜单栏
     * 1、QMenuBar 类给我们提供了一个菜单栏，在程序中我们可以直接获取默认的菜单栏，
     *  并向其中添加QMenu类型的菜单对象，然后向弹出的菜单中添加QAction类型的动作对象作为菜单项。
     * 2、QMenu类还提供了分隔线可以使用addSeparator()函数来添加，他可以将菜单进行分组。
     * 3、QAction动作包含了图标、菜单文本、快捷键、状态栏显示文本、提示文本（菜单项和工具栏）。
     * 4、QAction类还提供了checkable属性，是否可选的状态。
    */

    // 添加文件菜单
    QMenu * fileMenu = ui->menubar->addMenu(tr("文件(&F)"));
    // 打开菜单栏
    QAction *actionOpen = fileMenu->addAction(QIcon(":/image/images/new.png"),tr("打开(&O)"));
    actionOpen->setShortcut(QKeySequence("Ctrl+O")); // 设置快捷键
    fileMenu->addSeparator();
    QAction *actionEdit = fileMenu->addAction(QIcon(":/image/images/open.png"),tr("编辑(&E)"));
    actionEdit->setShortcut(QKeySequence("Ctrl+E")); // 设置快捷键
   // ui->mainToolBar->addAction(actionOpen);  // 在工具栏中添加动作

    /*
     * 动作组 QActionGroup类
     * 它可以包含一组动作QAction，可以设置仅有一个动作处于选中状态即互斥动作。
    */
    // 建立动作组
    QActionGroup *group = new QActionGroup(this);
    // 向动作组中添加动作
    QAction *actionLeft = group->addAction(tr("左对齐(&L)"));
    actionLeft->setCheckable(true);
    QAction *actionRight = group->addAction(tr("右对齐(&R)"));
    actionRight->setCheckable(true);
    QAction *actionCenter = group->addAction(tr("居中(&C)"));
    actionCenter->setCheckable(true);
    actionLeft->setChecked(true);
    fileMenu->addSeparator();
    fileMenu->addAction(actionLeft);
    fileMenu->addAction(actionRight);
    fileMenu->addAction(actionCenter);

    fileMenu->addSeparator();

    QAction *actionAlignment = fileMenu->addAction(tr("对齐") );

    QMenu *subSecondMenu = new QMenu();
    subSecondMenu->addAction(actionLeft);
    subSecondMenu->addAction(actionRight);
    subSecondMenu->addAction(actionCenter);
    actionAlignment->setMenu(subSecondMenu);
    /*
     * 工具栏 QToolBar类
     * QToolBar类包含了一组控件的可移动面板。
     * toolButtonStyle属性用来设置图标和相应的文本及相对位置；
     * movable设置工具栏是否可以移动；
     * allowedArea 设置允许停靠的位置
     * iconsize设置图标的大小
     * floatable设置是否可以悬浮
     *
     * initToolBar()
    */
    QToolBar *toolBar = new QToolBar(this);
    toolBar->addAction(actionOpen);
    toolBar->addAction(actionEdit);
    toolBar->addSeparator();
    toolBar->addAction(actionLeft);
    toolBar->addAction(actionRight);
    toolBar->addAction(actionCenter);

    addToolBar(Qt::TopToolBarArea, toolBar);

    /*
     * QToolButton 工具栏按钮类
     * 我们可以创建一个QToolButton类，给他添加一个弹出菜单，并设置弹出方式，然后添加到工具栏
    */
    QToolButton *toolBtn = new QToolButton(this);
    toolBtn->setText(tr("颜色"));
    QMenu *colorMenu = new QMenu(this);
    colorMenu->addAction("红色");
    colorMenu->addAction("绿色");
    toolBtn->setMenu(colorMenu);
    toolBtn->setPopupMode(QToolButton::MenuButtonPopup);
    toolBar->addWidget(toolBtn);

    /*
     * 状态栏 QStatusBar
     * 主要用来显示状态信息：如临时信息、正常信息、永久信息
     * 可以使用showMessage() 函数显示临时信息，它显示字状态栏的最左边
     * 使用addWidget()函数添加QLabel到状态栏，显示正常的信息，它也会显示在最左边，遮掩住临时信息
     * 使用 addPermanentWidget()函数添加QLabel到状态栏，来显示永久信息，它会生成到状态栏的最右端
    */
    ui->statusbar->showMessage(tr("hello qt..."), 2000);
    QLabel * permanent = new QLabel(this);
    permanent->setFrameStyle(QFrame::Box | QFrame::Sunken);
    permanent->setText("Version 1.0");
    ui->statusbar->addPermanentWidget(permanent);


    connect(actionOpen, SIGNAL(triggered()), SLOT(newActionTriggered()));
    connect(actionEdit, SIGNAL(triggered()), SLOT(editActionTriggered()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::newActionTriggered() {
    qDebug() << QTextCodec::codecForLocale()->name();

    // 在qt creator 4.11.1中乱码
     qDebug() << "新建窗口";
//     std::cout << "新建窗口" << std::endl ;

//    QTextCodec *corder= QTextCodec::codecForName ( "GBK" );
//    qDebug() << corder->toUnicode("新建窗口");
}

void MainWindow::editActionTriggered() {
//    QTextCodec *corder= QTextCodec::codecForName ( "GBK" );
    QMessageBox::information(this, tr("提示"), tr("中文内容"));
}
